package novanok.com.tracktweet;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class MapReduceUbicacionGeografica {
    private Map<String, Integer> ubicacion = new TreeMap<String, Integer>();
    private double FACTOR_UBICACION = 0.2;

    private int limiteUbicacion = 0;

    public MapReduceUbicacionGeografica (){ }

    public synchronized void analizar( String ubicacion ){
        synchronized (this.ubicacion) {
            String valor = ubicacion.toUpperCase();

            if ( this.ubicacion.get(valor) != null )
                this.ubicacion.put(valor, this.ubicacion.get(valor) + 1);
            else
                this.ubicacion.put(valor, 1);
        }

        this.purgar();
        this.actualizarLimite();
    }

    private synchronized void purgar(){
        synchronized (ubicacion) {
            if ( ubicacion.size() > 10 ) {
                List<String> remove = new LinkedList<String>();
                for (Map.Entry<String, Integer> v : ubicacion.entrySet())
                    if (v.getValue() == limiteUbicacion)
                        remove.add(v.getKey());

                for ( String s : remove )
                    ubicacion.remove( s );
            }
        }
    }

    private synchronized void actualizarLimite(){
        Map<String, Integer> lista = getUbicacionOrdenados();

        if ( lista != null && lista.values().size() > 0 )
            this.limiteUbicacion = ( int )( ( double ) lista.values().iterator().next() * FACTOR_UBICACION );
    }

    public synchronized Map<String, Integer> getUbicacionOrdenados(){
        synchronized (ubicacion) {
            return Comun.sortByValues(ubicacion);
        }
    }

    public void clear() {
        ubicacion.clear();
    }
}
